{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qwiz ООП\n",
    "Python 2.7.15\n",
    "*.ipynb Jupyter Notebook"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Для начала создадим основу нашего класса для студентов\n",
    "Для начала нужно описать класс студента. У каждого студента должны быть следующие атрибуты класса:\n",
    "- имя\n",
    "- фамилия\n",
    "- пол\n",
    "\n",
    "Без указания значений этих аттрибутов не должно быть возможности создать экземпляр класса.\n",
    "\n",
    "Код для описания класса “Студент”"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Student:\n",
    "    def __init__(self, name, surname, gender):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.gender = gender"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Anna Ivanowa Woman\n",
      "Peter\n"
     ]
    }
   ],
   "source": [
    "Anna = Student('Anna', 'Ivanowa', 'Woman')\n",
    "Peter = Student('Peter', 'Sidorow', 'Man')\n",
    "print(Anna.name, Anna.surname, Anna.gender)\n",
    "print(Peter.name)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Добавление информации о пройденных обучающимся курсов\n",
    "Мы обязательно должны знать, какие курсы студент уже прошел. Добавим и такой атрибут.\n",
    "Какой вариант позволит гарантировать корректную работу со списком курсов каждого конкретного обучающегося?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Student:\n",
    "    def __init__(self, name, surname, gender):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.gender = gender\n",
    "        self.finished_courses = []"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Отлично! Учитывая, что мы хотим изначально присвоить атрибуту класса изменяемый тип данных (пустой список), то данный способ позволит инициализировать этот атрибут для каждого экземпляра по отдельности и у каждого студента будут свои пройденные курсы."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Создаем класс преподавателей и экземпляры.\n",
    "Какое учебное заведение без преподавателей? Объявим соответствующий класс (у преподавателей есть закрепленный за ними список курсов), создадим по экземпляру наших классов и проверим содержимое атрибутов. Добавим возможность хранить информацию студентов об оценках (словарь) и о списке курсов, которые сейчас изучаются."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Student:\n",
    "    def __init__(self, name, surname, gender):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.gender = gender\n",
    "        self.finished_courses = []\n",
    "        self.courses_in_progress = []\n",
    "        self.grades = {}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Mentor:\n",
    "    def __init__(self, name, surname):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.courses_attached = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "best_student = Student('Ruoy', 'Eman', 'your_gender')\n",
    "best_student.finished_courses += ['Git']\n",
    "best_student.courses_in_progress += ['Python']\n",
    "best_student.grades['Git'] = [10, 10, 10, 10, 10]\n",
    "best_student.grades['Python'] = [10, 10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Git']\n",
      "['Python']\n",
      "{'Git': [10, 10, 10, 10, 10], 'Python': [10, 10]}\n"
     ]
    }
   ],
   "source": [
    "print(best_student.finished_courses)\n",
    "print(best_student.courses_in_progress)\n",
    "print(best_student.grades)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Python']\n"
     ]
    }
   ],
   "source": [
    "cool_mentor = Mentor('Some', 'Buddy')\n",
    "cool_mentor.courses_attached += ['Python']\n",
    "print(cool_mentor.courses_attached)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Выставление оценок\n",
    "Закончим работу, добавим классу Student метод для добавления пройденных курсов. И самое главное – реализуем взаимодействие классов на основе выставления преподавателями оценок студентам. Выберите такой вариант объявления методов, который будет рабочим и максимально корректным."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Python': [10]}\n",
      "['Python']\n"
     ]
    }
   ],
   "source": [
    "class Student:\n",
    "    def __init__(self, name, surname, gender):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.gender = gender\n",
    "        self.finished_courses = []\n",
    "        self.courses_in_progress = []\n",
    "        self.grades = {}\n",
    " \n",
    "    def add_courses(self, course_name):\n",
    "        self.finished_courses.append(course_name)   \n",
    " \n",
    "     \n",
    "class Mentor:\n",
    "    def __init__(self, name, surname):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.courses_attached = []\n",
    "        \n",
    "    def rate_hw(self, student, course, grade):\n",
    "        if isinstance(student, Student) and course in self.courses_attached and course in student.courses_in_progress:\n",
    "            if course in student.grades:\n",
    "                student.grades[course] += [grade]\n",
    "            else:\n",
    "                student.grades[course] = [grade]\n",
    "        else:\n",
    "            return 'Ошибка'\n",
    " \n",
    "best_student = Student('Ruoy', 'Eman', 'your_gender')\n",
    "best_student = Student('Anna', 'Ivanova', 'your_gender')\n",
    "best_student.courses_in_progress += ['Python']\n",
    " \n",
    "cool_mentor = Mentor('Some', 'Buddy')\n",
    "cool_mentor.courses_attached += ['Python']\n",
    " \n",
    "cool_mentor.rate_hw(best_student, 'Python', 10)\n",
    "cool_mentor.rate_hw(best_student, 'Python', 10)\n",
    "cool_mentor.rate_hw(best_student, 'Python', 8)\n",
    "\n",
    "print(best_student.grades)\n",
    "print(cool_mentor.courses_attached)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Супер! Для решения задачи мы создали метод, который будет проверять, что оценка выставляется именно экземпляру класса Student, при этом преподаватель должен быть прикреплен к соответствующему курсу, а студент должен его проходить. Только в таком случае оценка будет добавляться в словарь, иначе будем получать ошибку."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10.7 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.7"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
